<?php

class Auth {

    protected $fobiddenPage = "index.php?page=403";

    /**
     *
     * Crypt le mot de passe de manière
     * plus sécurisé. 
     */
    public function fujicrypt($password) {
        $PDO = getDbConnection();
        $req = $PDO->prepare('SELECT site_cryptage FROM ' . TB_INFO);
        $req->execute();
        $reqCryptage = $req->fetch();
        foreach ($reqCryptage as $key => $value) {
            switch ($key) {
                case 'site_cryptage':
                    $cryptage = $value;
                    break;
            }
        }
        if ($cryptage == "fujicrypt") {
            $pwd = $password;
            $pwd_md5 = md5($password . KEY3) . KEY1;
            $keygen = KEY1;
            $keyP1 = substr($keygen, 0, 10);
            $keyP2 = substr($keygen, 10);
            $pwd_FujiCrypt = $keyP2 . $pwd_md5 . $keyP1 . KEY2;
            return $pwd_FujiCrypt;
        } else if ($cryptage == "md5") {
            $pwd = $password;
            $pwd_md5 = md5($pwd);
            return $pwd_md5;
        } else if ($cryptage == "sha256") {
            $pwd = $password;
            $pwd_sha256 = crypt($pwd, '$5$');
            return $pwd_sha256;
        } else if ($cryptage == "sha512") {
            $pwd = $password;
            $pwd_sha512 = crypt($pwd, '$6$');
            return $pwd_sha512;
        } else if ($cryptage == "blowfish") {
            $pwd = $password;
            $pwd_blowfish = crypt($pwd, '$2a$');
            return $pwd_blowfish;
        } else if ($cryptage == "md5p") {
            $pwd = $password;
            $pwd_md5p = KEY3 . md5($pwd . KEY2) . KEY1;
            return $pwd_md5p;
        } else {
            return;
        }
    }

    /**
     *
     * Crypt la chaine entré dans l'argument $password, avec
     * la manière de cryptage de l'argument $cryptage.
     */
    public function cryptIn($password, $cryptage) {
        if ($cryptage == "fujicrypt") {
            $pwd = $password;
            $pwd_md5 = md5($password . KEY3) . KEY1;
            $keygen = KEY1;
            $keyP1 = substr($keygen, 0, 10);
            $keyP2 = substr($keygen, 10);
            $pwd_FujiCrypt = $keyP2 . $pwd_md5 . $keyP1 . KEY2;
            return $pwd_FujiCrypt;
        } else if ($cryptage == "md5") {
            $pwd = $password;
            $pwd_md5 = md5($pwd);
            return $pwd_md5;
        } else if ($cryptage == "sha256") {
            $pwd = $password;
            $pwd_sha256 = crypt($pwd, '$5$');
            return $pwd_sha256;
        } else if ($cryptage == "sha512") {
            $pwd = $password;
            $pwd_sha512 = crypt($pwd, '$6$');
            return $pwd_sha512;
        } else if ($cryptage == "blowfish") {
            $pwd = $password;
            $pwd_blowfish = crypt($pwd, '$2a$');
            return $pwd_blowfish;
        } else if ($cryptage == "md5p") {
            $pwd = $password;
            $pwd_md5p = KEY3 . md5($pwd . KEY2) . KEY1;
            return $pwd_md5p;
        } else {
            return;
        }
    }

    /**
     *
     * Permet d'authentifier un utilisateur.
     */
    public function login($d) {
        $PDO = getDbConnection();
        $d['password'] = $this->fujicrypt($d['password']);
        $req = $PDO->prepare('SELECT ' . TB_UTILISATEURS . '.id_user, ' . TB_UTILISATEURS . '.login, ' . TB_UTILISATEURS . '.nom, ' . TB_UTILISATEURS . '.prenom, ' . TB_UTILISATEURS . '.email, ' . TB_UTILISATEURS . '.sexe, ' . TB_UTILISATEURS . '.pays, ' . TB_UTILISATEURS . '.question_secrete, ' . TB_UTILISATEURS . '.reponse_secrete, ' . TB_UTILISATEURS . '.date_naissance, ' . TB_UTILISATEURS . '.skype, ' . TB_UTILISATEURS . '.facebook, ' . TB_UTILISATEURS . '.twitter, ' . TB_UTILISATEURS . '.google, ' . TB_UTILISATEURS . '.date_inscription, ' . TB_UTILISATEURS . '.nb_message, ' . TB_UTILISATEURS . '.statut, ' . TB_UTILISATEURS . '.image, ' . TB_RANG . '.name, ' . TB_RANG . '.slug, ' . TB_RANG . '.level FROM ' . TB_UTILISATEURS . ' LEFT JOIN ' . TB_RANG . ' ON ' . TB_UTILISATEURS . '.id_rang=' . TB_RANG . '.id WHERE ' . TB_UTILISATEURS . '.login = :login AND ' . TB_UTILISATEURS . '.pass = :password');
        $req->execute($d);
        $data = $req->fetchAll();
        if (count($data) > 0) {
            $_SESSION['Auth'] = $data[0];
            return true;
        }
        return false;
    }

    /**
     *
     * Autorise l'accès à une page.
     * Sinon redige sur 403.php
     */
    function allow($rang) {
        $PDO = getDbConnection();
        $req = $PDO->prepare('SELECT slug, level FROM ' . TB_RANG);
        $req->execute();
        $data = $req->fetchAll();
        $roles = array();
        foreach ($data as $d) {
            $roles[$d->slug] = $d->level;
        }
        if (!$this->user('slug')) {
            $this->forbidden();
        } else {
            if ($roles[$rang] > $this->user('level')) {
                $this->forbidden();
            } else {
                return true;
            }
        }
    }

    /**
     * Recupère une info de l'utilisateur.
     */
    function user($field) {
        if ($field == 'role') {
            $field = 'slug';
        }
        if (isset($_SESSION['Auth']->$field)) {
            return $_SESSION['Auth']->$field;
        } else {
            return false;
        }
    }

    /**
     * Modifie une info de l'utilisateur
     * @param type $field Info à modifier
     * @param type $newValue Nouvelle valeur
     */
    function updateUser($field, $newValue) {
        if (isset($_SESSION['Auth']->$field)) {
            $_SESSION['Auth']->$field = $newValue;
        }
    }

    public function forbidden() {
        header('Location:' . $this->fobiddenPage);
    }

}

?>
